[BITS 16]
[ORG 0]

start0:
;Установим сегментные регистры
	mov	ax, cs
	mov	ax, 0x07c0
	mov	ds, ax
	mov	ss, ax
	
;Скопируем текущий код в верхнюю часть памяти
	;mov	ax, 0x9000
	;mov	es, ax		;Копируем по адресу 0x90000
	;xor	si, si		;Обнулим
	;xor	di, di
;Копируем 512 байт (128*4)
	;mov	cx, 128
	;rep	movsd
;Передаем управление в скопированный код
	;jmp	0x9000:start1
;start1:
	;mov	ax, cs
	;mov	ds, ax
	;mov	ss, ax
	;mov	es, ax
;Вывод сообщения о работе первичного загрузчика
	mov	si, boot0_loaded
	call	puts
	;jmp	$
	

	
;Считываем вторичный загрузчик с дискеты в память
;Читаем по цилиндру
;В цилиндре 18 секторов по 512 байт в каждом
;т.е. 9216 (0x2400) байт 
;Область до 0x0500 для BIOS еще пригодится
;DL - номер диска (носителя)
;DH - номер головки
;CH - номер цилиндра (дорожки)
;CL - номер сектора
;AL - количество секторов (в сумме не более одного цилиндра)
;ES:BX - адрес буфера в памяти, в который будут считаны данные

;Для начала хватит одного цилиндра
	mov	ax, 0x2000
	mov	es, ax
	mov	bx, 0
	mov	ch, 0
	mov	dh, 0
	call	read_cylinder
;Считывание 2 цилиндра
	mov	ax, 0x2240
	mov	es, ax	
	mov bx, 0
	mov ch, 0
	mov dh, 1
	call	read_cylinder
;Считывание 3 цилиндра
	mov	ax, 0x2480
	mov	es, ax	
	mov bx, 0
	mov ch, 1
	mov dh, 0
	call	read_cylinder
;Считывание 4 цилиндра
	mov	ax, 0x26c0
	mov	es, ax	
	mov bx, 0
	mov ch, 1
	mov dh, 1
	call	read_cylinder
;Считывание 5 цилиндра
	mov	ax, 0x2900
	mov	es, ax	
	mov bx, 0
	mov ch, 2
	mov dh, 0
	call	read_cylinder	
;Считывание 6 цилиндра
	mov	ax, 0x2B40
	mov	es, ax	
	mov bx, 0
	mov ch, 2
	mov dh, 1
	call	read_cylinder	

;Считывание 7 цилиндра
	mov	ax, 0x2D80
	mov	es, ax	
	mov bx, 0
	mov ch, 3
	mov dh, 0
	call	read_cylinder	

;Считывание 8 цилиндра
;	mov	ax, 0x2FC0
;	mov	es, ax	
;	mov bx, 0
;	mov ch, 3
;	mov dh, 1
;	call	read_cylinder	

	
;	hlt
;	jmp $
	jmp	0x2000:0x0200	;0x0200 размер BOOT0 (512)

;Функция считывает цилиндр
read_cylinder:
	mov	[.err_num], byte 0	;Обнулим количество ошибок
	pusha
.begin:
	mov	ah, 0x02	;Номер функции прерывания BIOS
	mov	al, 18		;Количество считываемых секторов
	mov	cl, 1
	int	0x13		;Прерывание BIOS
	jc	.read_err
	popa
	ret
.err_num: db	0
.read_err:
	inc byte [.err_num]
	mov	si, err_msg
	call	puts
	cmp byte [.err_num], 5
	jl	.begin
	mov	si, abort
	call	puts
	hlt
	jmp	$

;Функция выводит строку в SI на экран
puts:
	pusha
.loop:
	lodsb
	test al, al
	jz .quit
	mov ah, 0x0e
	int 0x10
	jmp short .loop
.quit:
	popa
	ret
	
	
	
	
;#############################################
boot0_loaded:	db	"BOOT0 is loaded", 0x0a, 0x0d, 0
err_msg:	db	" flp_err ", 0x0a, 0x0d, 0
abort:		db	" BOOT1 not found!", 0x0a, 0x0d, 0
;Заполняем нулями до 512 байт
times 510-($-$$) db 0
;Последние два байта - сигнатура boot-сектора
db 0x55, 0xaa
incbin	"boot1.bin"
